package main

import (
	"fmt"
	"reflect"
)

/*
1、演示对（基本数据类型、interface、reflect.Value）进行反射的基本操作
2、演示对(结构体、interface{}、reflect.Value)进行反射的基本操作
*/
func reflectTest01(b interface{}) {
	//通过反射获取到传入变量的type，kind值
	//1先获取到reflect.Type
	rTyp := reflect.TypeOf(b)
	fmt.Println("rType=", rTyp)
	//2获取到reflect.Value
	rVal := reflect.ValueOf(b)
	n2 := 2 + rVal.Int() //得到v持有的值
	fmt.Println("n2=", n2)
	fmt.Printf("rVal=%v rVal type=%T\n", rVal, rVal)
	//下面将rVal转成interface{}
	iV := rVal.Interface()
	//将interface{}通过断言转成需要的类型
	num2 := iV.(int)
	fmt.Println("num2=", num2)
}

//2
func reflectTest02(b interface{}) {
	rTyp := reflect.TypeOf(b)
	fmt.Println(rTyp)
	rVal := reflect.ValueOf(b)
	iV := rVal.Interface()
	fmt.Printf("iV=%v iV type=%T\n", iV, iV)
	stu, ok := iV.(Student)
	if ok {
		fmt.Println("stu.Name=", stu.Name)
	}
}

type Student struct {
	Name string
	Age  int
}

func main() {
	//1
	var num int = 100
	reflectTest01(num)

	//2
	stu := Student{
		Name: "tom",
		Age:  20,
	}
	reflectTest02(stu)
}
